(function($){
    $.fn.extend({

    //pass the options variable to the function
    accordion: function(options) {
        
        var defaults = {
            accordion: 'true',
            speed: 300,
            closedSign: '[+]',
            openedSign: '[-]'
        };

        // Extend our default options with those provided.
        var opts = $.extend(defaults, options);
        //Assign current element to variable, in this case is UL element
         var $this = $(this);
         
         //add a mark [+] to a multilevel menu
         $this.find("li").each(function() {
             if($(this).find("ul").size() != 0){
                 //add the multilevel sign next to the link
                 $(this).find("a:first").append("<span>"+ opts.closedSign +"</span>");
                 
                 //avoid jumping to the top of the page when the href is an #
                 if($(this).find("a:first").attr('href') == "#"){
                       $(this).find("a:first").click(function(){return false;});
                   }
             }
         });

         //open active level
         $this.find("li.active").each(function() {
             $(this).parents("ul").slideDown(opts.speed);
             $(this).parents("ul").parent("li").find("span:first").html(opts.openedSign);
         });

          $this.find("li a").click(function() {
              if($(this).parent().find("ul").size() != 0){
                  if(opts.accordion){
                      //Do nothing when the list is open
                      if(!$(this).parent().find("ul").is(':visible')){
                          parents = $(this).parent().parents("ul");
                          visible = $this.find("ul:visible");
                          visible.each(function(visibleIndex){
                              var close = true;
                              parents.each(function(parentIndex){
                                  if(parents[parentIndex] == visible[visibleIndex]){
                                      close = false;
                                      return false;
                                  }
                              });
                              if(close){
                                  if($(this).parent().find("ul") != visible[visibleIndex]){
                                      $(visible[visibleIndex]).slideUp(opts.speed, function(){
                                          $(this).parent("li").find("span:first").html(opts.closedSign);
                                      });
                                      
                                  }
                              }
                          });
                      }
                  }
                  if($(this).parent().find("ul:first").is(":visible")){
                      $(this).parent().find("ul:first").slideUp(opts.speed, function(){
                          $(this).parent("li").find("span:first").delay(opts.speed).html(opts.closedSign);
                      });
                      
                      
                  }else{
                      $(this).parent().find("ul:first").slideDown(opts.speed, function(){
                          $(this).parent("li").find("span:first").delay(opts.speed).html(opts.openedSign);
                      });
                  }
              }
          });
    }
});
})(jQuery);